Rust 生命周期
阐述
生命周期是变量(也即内存中的一块值)存活的时间。为了保证引用是有效的,引用变量的生命周期必须比被引用变量的生命周期短。
在函数、方法、Rust 结构体、Rust 枚举、Rust 特征的实现中都需要生命周期的标注。
界限
'b: 'a
表示'b
至少和'a
一样长T: 'a
表示所有T
的引用至少和'a
一样长
生命周期消除
消除是指的不标注某些生命周期的语法视为与标注了这些生命周期的语法等价,所以我们不需要标注某些生命周期。
大部分涉及引用的函数和方法不需要手动标注生命周期,这是因为有 3 条规则可以帮我们消除生命周期:
- 每一个引用参数都会获得自己的输入生命周期;
- 如果只有一个输入生命周期,那么这个生命周期会被赋给输出生命周期;
- 如果存在多个输入生命周期,且其中一个是
&self
或者&mut self
,那么 self 的生命周期会被赋给输出生命周期
实例
函数、Rust 方法的生命周期
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
struct Owner(i32);
impl Owner {
// Annotate lifetimes as in a standalone function.
fn add_one<'a>(&'a mut self) { self.0 += 1; }
fn print<'a>(&'a self) {
println!("`print`: {}", self.0);
}
}
Rust 结构体、Rust 枚举的生命周期
// A type `Borrowed` which houses a reference to an
// `i32`. The reference to `i32` must outlive `Borrowed`.
##[derive(Debug)]
struct Borrowed<'a>(&'a i32);
// Similarly, both references here must outlive this structure.
##[derive(Debug)]
struct NamedBorrowed<'a> {
x: &'a i32,
y: &'a i32,
}
// An enum which is either an `i32` or a reference to one.
##[derive(Debug)]
enum Either<'a> {
Num(i32),
Ref(&'a i32),
}
实现的生命周期
struct ImportantExcerpt<'a> {
part: &'a str,
}
impl<'a> ImportantExcerpt<'a> {
fn level(&self) -> i32 {
3
}
}
静态生命周期
生命周期 'static
的含义是拥有该生命周期的引用可以和整个程序活得一样长。